from flask import Flask
from flask_login import LoginManager
from flask_wtf.csrf import CSRFProtect, generate_csrf
from app.routes import register_routes
from app.models.db import close_db
from app.models.user import load_user
from app.config import config
from app.utils.log_config import get_logger
import os

# 配置日志
logger = get_logger('app')

# 初始化登录管理器
login_manager = LoginManager()
login_manager.login_view = 'auth.login_page'  # 未登录时跳转的登录页
login_manager.login_message = '请先登录后再访问该页面'
login_manager.login_message_category = 'warning'  # 添加消息类别

# 初始化CSRF保护
csrf = CSRFProtect()

def create_app(config_name=None):
    """创建应用实例
    
    Args:
        config_name: 配置名称，可选值：'development', 'testing', 'production'
    """
    # 获取配置名称，默认从环境变量获取或使用development
    if config_name is None:
        config_name = os.environ.get('FLASK_CONFIG', 'development')
    
    app = Flask(__name__, template_folder='../templates')
    
    # 加载配置
    app.config.from_object(config[config_name])
    
    # 初始化扩展
    login_manager.init_app(app)
    login_manager.user_loader(load_user)  # 配置用户加载回调
    # 初始化CSRF保护
    csrf.init_app(app)  # 启用CSRF保护
    
    # 路由会在所有扩展初始化后注册
    
    # Flask-WTF已经自动提供了csrf_token函数到模板上下文
    # 移除自定义的上下文处理器以避免冲突
    
    # 注册数据库关闭回调
    app.teardown_appcontext(close_db)
    
    # 全局异常处理
    @app.errorhandler(404)
    def page_not_found(e):
        logger.warning(f'页面未找到: {e}')
        return {'status': 'error', 'message': '页面未找到'}, 404
    
    @app.errorhandler(500)
    def internal_server_error(e):
        logger.error(f'服务器内部错误: {e}')
        return {'status': 'error', 'message': '服务器内部错误'}, 500
    
    # 初始化数据库
    with app.app_context():
        from app.models.init_db import init_db
        try:
            init_db()
            logger.info('数据库初始化成功')
        except Exception as e:
            logger.error(f'数据库初始化失败: {e}')
            raise
    
    # 注册蓝图
    register_routes(app)
    
    logger.info(f'应用初始化完成，当前环境: {config_name}')
    return app